/**
 * @file all.h
 * @brief libco all-in-one头文件，用于外部调用，本目录下的文件绝不应该包含这个头文件
 * 
 * @section 项目描述 项目描述
 * C++高性能协程库,（包含日志模块，配置模块，线程模块，协程模块，协程调度模块，io协程调度模块，hook模块，socket模块，bytearray序列化，http模块，TcpServer模块，Websocket模块，Https模块等, Smtp邮件模块, MySQL, SQLite3, ORM,Redis,Zookeeper)
 * 
 * @section 日志模块 日志模块
 * 支持流式日志风格写日志和格式化风格写日志，支持日志格式自定义，日志级别，多日志分离等等功能 流式日志使用：SYLAR_LOG_INFO(g_logger) << "this is a log"; 格式化日志使用：SYLAR_LOG_FMT_INFO(g_logger, "%s", "this is a log"); 支持时间,线程id,线程名称,日志级别,日志名称,文件名,行号等内容的自由配置
 * 
 */

#ifndef __LIBCO_ALL_H__
#define __LIBCO_ALL_H__

#include "util.h"
#include "macro.h"
#include "log.hpp"
#include "singleton.hpp"
#include "mutex.hpp"
#include "noncopyable.hpp"
#include "thread.hpp"
#include "coroutine.hpp"
#include "concurrent.hpp"
#include "processor.hpp"
#include "monitor.hpp"
#include "channel.hpp"
#include "epollevent.hpp"
#include "hook.hpp"

#define co_yield [](){\
    auto self = libco::Coroutine::GetThis(); \
    co_func(self);   \
    self->yield(); \
}();

template<typename Func>
void co_func(Func f) {
    libco::Monitor::schedule(f);
}

template<typename Func, typename ...Args>
void co_func(Func f, Args... args) {
    libco::Monitor::schedule(std::bind(f, std::forward<Args>(args)...));
}

template<>
void co_func(libco::Coroutine::ptr co) {
    libco::Monitor::schedule(co);
}

#endif